﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanLyHocPhi.Model;
using System.Data.Common;

namespace QuanLyHocPhi.BLL
{
    /// <summary>
    /// Lớp xử lý dữ liệu liên quan đến trường, lớp của các sinh viên không chuyên
    /// </summary>
    class BizTruong
    {
        /// <summary>
        /// Lấy toàn bộ danh sách các trường
        /// </summary>
        /// <returns></returns>
        public static IList<Truong> GetList_Truong()
        {
            using (var context = new QLHPEntities())
            {
                var lstTruong = context.TruongDbSet.Where(e => e.MaTruong != "GDTC").ToList().ToSortableBindingList();
                //var lstTruong = context.TruongDbSet.ToList().ToSortableBindingList();
                
                return lstTruong;
            }
        }

        /// <summary>
        /// Lấy toàn bộ danh sách các trường
        /// </summary>
        /// <returns></returns>
        public static IList<Truong> GetList_Truong(bool baoGomChuyen)
        {
            using (var context = new QLHPEntities())
            {
                //var lstTruong = context.TruongDbSet.Where(e => e.MaTruong != "GDTC").ToList().ToSortableBindingList();
                var lstTruong = context.TruongDbSet.ToList().ToSortableBindingList();

                return lstTruong;
            }
        }

        /// <summary>
        /// Cập nhật trường theo mã trường
        /// </summary>
        /// <param name="truong"></param>
        public static void Update_Truong(Truong truong)
        {
            using (var context = new QLHPEntities())
            {
                Truong truongDb = context.TruongDbSet.
                    Where(itemTruong => itemTruong.MaTruong == truong.MaTruong).First<Truong>();
                truongDb.TenTruong = truong.TenTruong;
                context.SaveChanges();
            }
        }

        /// <summary>
        /// Xoá thực thế trường
        /// </summary>
        /// <param name="oTruong"></param>
        public static void Delete_Truong(Truong oTruong)
        {
            using (var context = new QLHPEntities())
            {
                var truong = (from itemTruong in context.TruongDbSet
                              where itemTruong.MaTruong == oTruong.MaTruong
                              select itemTruong).First<Truong>();
                var count = truong.LopCollection.Count;
                if (count == 0)
                {
                    context.TruongDbSet.Remove(truong);
                    context.SaveChanges();
                }
                else
                    throw new Exception("Không thể xoá dữ liệu của trường do trường này còn chứa lớp có liên quan!");
            }
        }

        /// <summary>
        /// Bổ sung trường
        /// </summary>
        /// <param name="oTruong"></param>
        internal static void Add_Truong(Truong oTruong)
        {
            using (var context = new QLHPEntities())
            {
                Truong truongDb = new Truong
                {
                    MaTruong = oTruong.MaTruong,
                    TenTruong = oTruong.TenTruong
                };
                context.TruongDbSet.Add(truongDb);
                context.SaveChanges();
            }
        }

        /// <summary>
        /// Lấy danh sách các lớp thuộc một trường
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        internal static IList<Lop> GetList_LopKhongChuyen(string maTruong, int namTuyenSinh)
        {
            using (var context = new QLHPEntities())
            {
                return context.LopDbSet
                    .Where(lop => lop.MaTruong == maTruong && lop.NamTuyenSinh == namTuyenSinh)
                    .OrderBy(lop => lop.NamTuyenSinh)
                    .OrderBy(lop => lop.TenLop)
                    .ToList().ToSortableBindingList();
            }
        }

        internal static IList<Lop> GetList_LopKhongChuyen(string maTruong)
        {
            using (var context = new QLHPEntities())
            {
                return context.LopDbSet
                    .Where(lop => lop.MaTruong == maTruong)
                    .ToList();
            }
        }

        internal static void Delete_LopKhongChuyen(Lop lop)
        {
            using (var context = new QLHPEntities())
            {
                Lop lopDb = (from itemLop in context.LopDbSet
                             where itemLop.MaLop == lop.MaLop
                             select itemLop).FirstOrDefault();
                if (lopDb == null)
                    throw new Exception("Lớp không tồn tại trong cơ sở dữ liệu");
                int count = (from itemSinhVien in context.SinhVienDbSet
                             where itemSinhVien.KC_MaLop == lop.MaLop
                             select itemSinhVien.MaSinhVien).Count();
                if (count > 0)
                    throw new Exception("Không thể xoá lớp này do lớp còn có chứa sinh viên. Lớp còn chứa sinh viên");
                context.LopDbSet.Remove(lopDb);
                context.SaveChanges();
            }
        }

        internal static void Update_LopKhongChuyen(Lop pLop)
        {
            using (var context = new QLHPEntities())
            {
                // Kiểm tra xem có lớp nào trong trường đó mà trùng tên hay chưa
                int count = (from lop in context.LopDbSet
                             where lop.MaLop != pLop.MaLop &&
                             lop.TenLop == pLop.TenLop &&
                             lop.MaTruong == pLop.MaTruong
                             select lop.TenLop).Count();
                if (count > 0)
                    throw new Exception("Không được đặt tên 2 lớp trùng với tên lớp đã có!");

                Lop oLop = (from itemLop in context.LopDbSet
                            where itemLop.MaLop == pLop.MaLop
                            select itemLop).FirstOrDefault();
                if (oLop == null)
                    throw new Exception("Lớp không còn tồn tại trong cơ sở dữ liệu");
                oLop.MaTruong = pLop.MaTruong;
                oLop.TenLop = pLop.TenLop;
                oLop.NamTuyenSinh = pLop.NamTuyenSinh;
                //oLop.GhiChu = pLop.GhiChu;
                context.SaveChanges();
            }
        }

        /// <summary>
        /// Bổ sung một lớp không chuyên.
        /// Các trường hợp sử dụng:
        /// - Bổ sung 1 lớp gốc vào hệ thống khi phát hiện sinh viên thuộc lớp mới
        /// </summary>
        /// <param name="pLop"></param>
        internal static void Add_LopKhongChuyen(Lop pLop)
        {
            using (var context = new QLHPEntities())
            {
                // Kiểm tra xem có lớp nào trong trường đó mà trùng tên hay chưa
                int count = (from lop in context.LopDbSet
                             where lop.MaLop != pLop.MaLop &&
                             lop.TenLop == pLop.TenLop &&
                             lop.MaTruong == pLop.MaTruong
                             select lop.MaLop).Count();
                if (count > 0)
                    throw new Exception("Không được đặt tên 2 lớp trùng với tên lớp đã có!");

                Lop oLop = new Lop
                {
                    MaLop = pLop.MaLop,
                    MaTruong = pLop.MaTruong,
                    TenLop = pLop.TenLop,
                    NamTuyenSinh = pLop.NamTuyenSinh,
                    //GhiChu = pLop.GhiChu
                };
                context.LopDbSet.Add(oLop);
                context.SaveChanges();
            }
        }

        /// <summary>
        /// Lấy một thực thể Lop với các giá trị mặc định
        /// </summary>
        /// <returns></returns>
        internal static Lop GetNew_LopKhongChuyen()
        {
            Lop lop = new Lop
            {
                MaLop = System.Guid.NewGuid().ToString(),
                MaTruong = "",
                NamTuyenSinh = DateTime.Now.Year,
                TenLop = ""
            };
            return lop;
        }

        /// <summary>
        /// Lấy một thực thể Lop với các giá trị mặc định
        /// </summary>
        /// <param name="maTruong"></param>
        /// <returns></returns>
        internal static Lop GetNew_LopKhongChuyen(string maTruong)
        {
            return new Lop
            {
                MaLop = System.Guid.NewGuid().ToString(),
                MaTruong = maTruong,
                NamTuyenSinh = DateTime.Now.Year,
                TenLop = ""
            };
        }

        /// <summary>
        /// Lấy một thực thể Lop với các giá trị mặc định
        /// </summary>
        /// <param name="maTruong"></param>
        /// <param name="namTuyenSinh"></param>
        /// <returns></returns>
        internal static Lop GetNew_LopKhongChuyen(string maTruong, string namTuyenSinh)
        {
            int nam = -1;
            try
            {
                nam = Convert.ToInt32(namTuyenSinh);
            }
            catch
            {
                nam = -1;
            }

            return new Lop
            {
                MaLop = Guid.NewGuid().ToString(),
                MaTruong = maTruong,
                NamTuyenSinh = nam
            };
        }
        internal static Lop GetNew_LopChuyen(string namTuyenSinh)
        {
            int nam = -1;
            try
            {
                nam = Convert.ToInt32(namTuyenSinh);
            }
            catch
            {
                nam = -1;
            }

            return new Lop
            {
                MaLop = Guid.NewGuid().ToString(),
                MaTruong = "GDTC",
                NamTuyenSinh = nam
            };
        }
        /// <summary>
        /// Lấy một thực thể Truong với các giá trị mặc định
        /// </summary>
        /// <returns></returns>
        internal static Truong GetNew_Truong()
        {
            Truong truong = new Truong
            {
                MaTruong = "",
                TenTruong = ""
            };
            return truong;
        }

        /// <summary>
        /// Lấy thông tin danh sách các lớp gốc cùng với sĩ số sinh viên
        /// </summary>
        /// <param name="maTruong">Mã trường</param>
        /// <param name="namTuyenSinh">Năm tuyển sinh</param>
        /// <returns></returns>
        internal static Dictionary<string, int> GetDictSiSoLopCuaTruong(string maTruong, int namTuyenSinh)
        {
            using (var context = new QLHPEntities())
            {
                var lstLop = from lop in context.LopDbSet
                             where lop.MaTruong == maTruong && lop.NamTuyenSinh == namTuyenSinh
                             select new { MaLop = lop.MaLop, SiSo = lop.SinhVienCollection.Count };
                var dictLop = new Dictionary<string, int>();
                foreach (var lop in lstLop)
                    dictLop.Add(lop.MaLop, lop.SiSo);
                return dictLop;
            }
        }

        /// <summary>
        /// Lấy danh sách các năm tuyển sinh của 1 trường
        /// </summary>
        /// <param name="maTruong"></param>
        /// <returns></returns>
        internal static List<string> GetList_NamTuyenSinh(string maTruong)
        {
            using (var context = new QLHPEntities())
            {
                var lstGroupNamTuyenSinh = from lop in context.LopDbSet
                                           where lop.MaTruong == maTruong
                                           group lop by lop.NamTuyenSinh into NamTuyenSinhGroup
                                           orderby NamTuyenSinhGroup.Key descending
                                           select new { NamTuyenSinh = NamTuyenSinhGroup.Key };
                var lstNamTuyenSinh = new List<string>();
                foreach (var group in lstGroupNamTuyenSinh)
                    lstNamTuyenSinh.Add(group.NamTuyenSinh.ToString());
                return lstNamTuyenSinh;
            }
        }
        internal static Truong GetTruongByMaTruong(string maTruong)
        {
            using (var context = new QLHPEntities())
            {
                return context.TruongDbSet.FirstOrDefault(e => e.MaTruong == maTruong);
            }
        }
    }
}
